package com.jidolstar.astro.datetimes
{
	import com.jidolstar.astro.utils.AstroMath;
	
	/**
	 * Universal Time(세계시)
	 */ 
	public class UT extends AstroDateTime
	{
		/**
		 * 생성자 
		 * @param value Number, GST, LCT, LST 값이 올 수 있다. Number인 경우 JD로 인식한다.
		 */ 
		public function UT( value:* )
		{
			if( value is Number )
			{
				super( value, JulianDateFormat.JD );
			}
			else if( value is GMST )
			{
				setGMST( value );
			}
			else if( value is LCT )
			{
				setLCT( value );
			}
			else if( value is LMST )
			{
				setLMST( value );
			}
			else if( value is AstroDateTime )
			{
				this.setDateTime( (value as AstroDateTime).date, (value as AstroDateTime).time );
			}
			else
			{
				throw new ArgumentError("First parameter is wrong value type.");
			}
		}
		
		/**
		 * GMST(Greenwitch mean Sidereal Time)으로 설정
		 * GMST를 UT로 설정하는 과정이다. 항성일은 태양일보다 하루에 약 4분가량 짧다. 
		 * 가령 0h UT에 남중한 별은 다음날 0h UT에 보면 4분전에 남중하게 된다.
		 * GMST는 말그대로 평균값이며 GAST(Greenwich Apparent Sidereal Time)으로 적용하려면 장동운동 및 황동 경사이동까지 고려해야한다.  
		 * 
		 * @see 
		 *  Practical Astronomy with your calculator. P.18
		 *  http://astronote.org/board/?table_name=prog&job=view&idx=23979
		 *  http://astronote.org/board/?table_name=prog&job=view&idx=23980 
		 *  http://astronote.org/board/?table_name=prog&job=view&idx=23981
		 * 
		 */ 
		public function setGMST( gmst:GMST ):void
		{
			var gmst_jd0:Number = gmst.jd0;
			var gmst_hours:Number = gmst.hours;
			var t:Number = ( gmst_jd0 - 2451545.0 ) / 36525.0;
			var t0:Number = 6.697374558 + ( 2400.051336 * t ) + ( 0.000025862 * t * t );
			t0 = AstroMath.normalize(t0, 0, 24);
			var ut_hours:Number = (gmst_hours - t0);
			ut_hours = AstroMath.normalize( ut_hours, 0, 24 );
			ut_hours *= 0.9972695663;
			this.julianDate = new JulianDate( gmst_jd0 + ut_hours / 24.0, JulianDateFormat.JD ); 
		}
		
		/**
		 * LST(Local Mean Sidereal Time)로 설정 
		 */ 
		public function setLMST( lst:LMST ):void
		{
		}
		
		/**
		 * LCT(Local Civil Time)로 설정 
		 */ 
		public function setLCT( lct:LCT ):void
		{
			
		}

	}
}